#ifndef ROBOTMEMORYCACHE_H
#define ROBOTMEMORYCACHE_H

#include <QObject>
#include <QVariantMap>
#include <QVariantList>
#include <QDateTime>
#include <QMutex>
#include <QTimer>
#include <QJsonObject>

/**
 * @brief 机器人内存状态缓存管理器
 * 
 * 设计原则：
 * - 内存优先：所有实时状态数据优先存储在内存中
 * - 超低延迟：QML界面直接从内存获取数据，无I/O延迟
 * - 线程安全：使用互斥锁确保多线程访问安全
 * - 自动清理：定时清理离线机器人的内存数据
 */
class RobotMemoryCache : public QObject
{
    Q_OBJECT

public:
    explicit RobotMemoryCache(QObject *parent = nullptr);
    ~RobotMemoryCache();

    /**
     * @brief 更新机器人实时状态数据
     * @param sn 机器人序列号
     * @param data 状态数据（位置、温度、电量等）
     */
    void updateRobotStatus(const QString &sn, const QVariantMap &data);

    /**
     * @brief 更新机器人在线状态
     * @param sn 机器人序列号
     * @param online 在线状态
     * @param lastPing 最后心跳时间
     */
    void updateRobotConnection(const QString &sn, bool online, const QDateTime &lastPing);

    /**
     * @brief 获取机器人当前状态
     * @param sn 机器人序列号
     * @return 机器人状态数据，包含位置、温度等信息
     */
    QVariantMap getRobotStatus(const QString &sn) const;

    /**
     * @brief 获取所有在线机器人状态
     * @return 在线机器人列表
     */
    QVariantList getAllOnlineRobots() const;

    /**
     * @brief 获取机器人最后更新时间
     * @param sn 机器人序列号
     * @return 最后更新时间
     */
    QDateTime getLastUpdateTime(const QString &sn) const;

    /**
     * @brief 检查机器人是否在线
     * @param sn 机器人序列号
     * @return true表示在线
     */
    bool isRobotOnline(const QString &sn) const;

    /**
     * @brief 移除机器人内存数据（当机器人离线时）
     * @param sn 机器人序列号
     */
    void removeRobot(const QString &sn);

    /**
     * @brief 获取需要归档到数据库的机器人数据
     * @return 需要归档的机器人数据列表
     */
    QVariantList getRobotsForArchiving() const;

    /**
     * @brief 标记数据已归档，清空归档队列
     * @param sn 机器人序列号
     */
    void markAsArchived(const QString &sn);

    /**
     * @brief 获取内存中的机器人数量
     * @return 机器人数量
     */
    int getRobotCount() const;

signals:
    /**
     * @brief 机器人状态更新信号
     */
    void robotStatusUpdated(const QString &sn, const QVariantMap &data);

    /**
     * @brief 机器人在线状态变化信号
     */
    void robotConnectionChanged(const QString &sn, bool online);

    /**
     * @brief 离线机器人清理信号
     */
    void offlineRobotCleaned(const QString &sn);

private slots:
    /**
     * @brief 定时清理离线机器人数据
     */
    void cleanupOfflineRobots();

private:
    /**
     * @brief 机器人状态结构体
     */
    struct RobotStatus {
        QVariantMap data;           // 实时数据（位置、温度等）
        bool online;                // 在线状态
        QDateTime lastUpdate;       // 最后更新时间
        QDateTime lastPing;         // 最后心跳时间
        QDateTime lastArchive;      // 最后归档时间
        bool needsArchiving;        // 是否需要归档
    };

    /**
     * @brief 机器人状态映射表
     */
    mutable QMutex m_mutex;
    QHash<QString, RobotStatus> m_robotStatusMap;

    /**
     * @brief 清理定时器
     */
    QTimer *m_cleanupTimer;

    /**
     * @brief 离线超时时间（毫秒）
     */
    static const int OFFLINE_TIMEOUT = 45000; // 45秒

    /**
     * @brief 归档间隔时间（毫秒）
     */
    static const int ARCHIVE_INTERVAL = 300000; // 5分钟
};

#endif // ROBOTMEMORYCACHE_H